import traceback
import view
from fpdf import FPDF
import warnings
from tkinter.messagebox import showerror

warnings.filterwarnings("ignore")

SIMYOU = '../font/SIMYOU.ttf'
SmileySans = '../font/SmileySans-Oblique.ttf'

head_begin = {'w': 40, 'h': 12, 'border': 1, 'ln': 0, 'align': 'C'}
head_end = {'w': 30, 'h': 12, 'border': 1, 'ln': 2, 'align': 'C'}
head_normal = {'w': 30, 'h': 12, 'border': 1, 'ln': 0, 'align': 'C'}

body_begin = {'w': 40, 'h': 8, 'border': 1, 'ln': 0, 'align': 'C'}
body_normal = {'w': 30, 'h': 8, 'border': 1, 'ln': 0, 'align': 'C'}

head_txt = ['货物编号', '货物名字', '单个货物价格', '购买个数', '总价']


def generate_data(pdf: FPDF, orders: list):
    try:
        pdf.set_font('SmileySans', 'B', 12)  # 设置表头字体
        # 生成表头
        for i, item in enumerate(head_txt):
            if i == 0:
                pdf.cell(**head_begin, txt=str(item))
            elif i == len(head_txt) - 1:
                pdf.cell(**head_end, txt=item)
            else:
                pdf.cell(**head_normal, txt=item)
        pdf.cell(-130)  # 将定位向下移动90个单位
        pdf.set_font('SIMYOU', '', 10)  # 设置表体字体
        # 生成表体
        for order in orders:
            for i, item in enumerate(order):
                item = str(item)
                if i == 0:
                    pdf.cell(**body_begin, txt=item)
                elif i == 2 or i == 4:  # 价格后面加上rmb符号
                    tmp = item + '元'
                    pdf.cell(**body_normal, txt=tmp)
                else:
                    pdf.cell(**body_normal, txt=item)
            pdf.ln()  # 换行
            pdf.cell(10)  # 将定位向右移动10个单位
    except Exception as e:
        view.logger.error(traceback.print_exc())
        view.logger.error(e)


def generate_pdf(save_path: str, orders_group_id: int):
    try:
        pdf = FPDF()
        pdf.add_font('SmileySans', 'B', SmileySans, uni=True)
        pdf.add_font('SIMYOU', '', SIMYOU, uni=True)
        pdf.add_page()  # 新建一页
        pdf.set_xy(0, 0)
        pdf.set_font('SmileySans', 'B', 16)  # 设置字体
        pdf.cell(w=60)  # 将定位向右移动60个单位
        pdf.cell(w=90, h=20, txt='XXX家具店', border='B', ln=2, align='C')
        pdf.cell(-40)  # 将定位向左移动40个单位
        # 生成订单数据
        orders = view.get_orders_by_orders_group_id(orders_group_id)
        generate_data(pdf, orders)
        # 生成PDF
        pdf.output(name=save_path, dest='F')
        return True
    except Exception as e:
        view.logger.error(traceback.print_exc())
        view.logger.error(e)
        showerror("错误", "生成PDF文件出错。")
        return False


if __name__ == '__main__':
    generate_pdf(1)
